package com.qiku.authority.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.qiku.authority.pojo.EduConstant;
import com.qiku.authority.pojo.User;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 用于创建、校验、解析 token令牌的工具类
 */
public class JwtUtils {

    // 定义secret密钥 自定义
    private static final String TOKEN_SECRET = "yongjiewujian";

    // 设置过期时间
    private static final long EXPIRE_TIME = 15 * 60 * 1000;


    /**
     * 创建Token令牌 并设置过期时间
     * @param user
     * @return
     */
    public static String createToken(User user){
        // 获取过期时间         当前时间的毫秒数         +  过期时间毫秒数
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        // 密钥加密算法
        Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
        // 设置头部信息
        Map<String , Object> header = new HashMap<>();
        header.put("typ" , "jwt");
        header.put("alg" , "HS256");

        return JWT.create().withHeader(header)   // 第一部分
                .withClaim("nickname" , user.getName())  // 第二部分
                .withClaim("userid" , user.getId())
                .withClaim("password" , user.getPassword())
                .withClaim("portrait" , user.getPortrait())
                .withExpiresAt(date)  // 设置过期时间
                .sign(algorithm);    // 加密


    }


    /**
     * 校验token是否正确
     * @param token
     * @return
     */
    public static int isVerify(String token){
        try{
            // 根据HMAC256算法生成签名
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(token); // 解析token

            return EduConstant.TOKEN_SUCCESS_CODE; // 校验通过
        }catch (TokenExpiredException e){
            return EduConstant.TOKEN_TIMEOUT_CDOE; // token过期
        }catch (JWTDecodeException e){
            return EduConstant.TOKEN_NULL_CODE;   // token 格式错误 或为空令牌
        }catch (JWTVerificationException e){
            return EduConstant.TOKEN_ERROR_CDOE;    // 校验失败 令牌错误
        }

    }


    /**
     * 从Token中 解析出 userId
     * @return
     */
    public static int parseTokenUserId(String token){
        DecodedJWT decode = JWT.decode(token);
        Integer userid = decode.getClaim("userid").asInt();
        return userid;
    }


    /**
     * 从Token中 解析出 nickname
     * @return
     */
    public static String parseTokenNickName(String token){
        DecodedJWT decode = JWT.decode(token);
        String username= decode.getClaim("nickname").asString();
        return username;
    }


    /**
     * 从Token中 解析出 password
     * @return
     */
    public static String parseTokenNickPassword(String token){
        DecodedJWT decode = JWT.decode(token);
        String password = decode.getClaim("password").asString();
        return password;
    }

    /**
     * 从Token中 解析出 portrait
     * @return
     */
    public static String parseTokenNickPortrait(String token){
        DecodedJWT decode = JWT.decode(token);
        String portrait= decode.getClaim("portrait").asString();
        return portrait;
    }





//    public static void main(String[] args) {
//        User user = new User();
//        user.setName("秦羽");
//        user.setPassword("123456");
//        user.setId(1001);
//        user.setPortrait("www.abc.com");
//
//        String token = createToken(user);
//        System.out.println("生成的令牌：" + token);
//        System.out.println("解析令牌");
//        System.out.println("userId = " + parseTokenUserId(token));
//        System.out.println("userName = " + parseTokenNickName(token));
//        System.out.println("userPassword = " + parseTokenNickPassword(token));
//        System.out.println("userPortrait = " + parseTokenNickPortrait(token));
//
//
//    }

}
